#include <vector>
#include <string>
#include <stdio.h>

/**
 *! @brief  定义二维泛型std::vector对象命名为Mat, 多用于邻接矩阵, 二维数组等问题.
 *! @tparam T 模版泛型类型
 */
template<typename T>
using Mat = std::vector<std::vector<T>>;




/**
 *! @brief  定义二维泛型std::vector对象命名为Board, 多用于二维棋盘之类的问题.
 *! @tparam T 模版泛型类型
 */
template<typename T>
using Board = std::vector<std::vector<T>>;




/**
 *! @brief  定义一维泛型std::vector对象命名为Vec.
 *! @tparam T 模版泛型类型
 */
template<typename T>
using Vec = std::vector<T>;




/**
 * @brief  打印一维泛型向量，主要面向float和double类型
 * @tparam T     泛型类型
 * @param  vec   输入向量
 */
template<typename T>
void prinVec(Vec<T>& vec) {
    for (size_t i = 0; i < vec.size(); i++) {
        printf("%.5f ", vec[i]);
    }
    printf("\n");
}




/**
 * @brief  打印一维泛型向量，主要面向int类型
 * @tparam       模板特化int类型
 * @param  vec   输入int类型向量
 */
template<>
void prinVec(Vec<int>& vec) {
    for (size_t i = 0; i < vec.size(); i++) {
        printf("%5d ", vec[i]);
    }
    printf("\n");
}




/**
 * @brief  打印一维泛型向量，主要面向int类型
 * @tparam       模板特化char类型
 * @param  vec   输入char类型向量
 */
template<>
void prinVec(Vec<char>& vec) {
    for (size_t i = 0; i < vec.size(); i++) {
        printf("%c ", vec[i]);
    }
    printf("\n");
}




/**
 * @brief  打印二维泛型向量，主要面向float和double类型
 * @tparam T     泛型类型
 * @param  vec   输入向量
 */
template<typename T>
void prinMat(Mat<T>& mat) {
    for (int i = 0; i < mat.size(); i++) {
        for (int j = 0; j < mat[0].size(); j++){
            printf("%.5f ", mat[i][j]);
        }
        printf("\n");
    }
}



/**
 * @brief  打印二维泛型向量，主要面向int类型
 * @tparam       模板特化char类型
 * @param  mat   输入char类型向量
 */
template<>
void prinMat(Mat<int>& mat) {
    for (int i = 0; i < mat.size(); i++) {
        for (int j = 0; j < mat[0].size(); j++){
            printf("%5d ", mat[i][j]);
        }
        printf("\n");
    }
}




/**
 * @brief  打印二维泛型向量，主要面向int类型
 * @tparam       模板特化char类型
 * @param  mat   输入char类型向量
 */
template<>
void prinMat(Mat<char>& mat) {
    for (int i = 0; i < mat.size(); i++) {
        for (int j = 0; j < mat[0].size(); j++){
            printf("%c ", mat[i][j]);
        }
        printf("\n");
    }
}